void main() {
  //构造函数是不能继承的
  //1、类默认有一个无参构造函数
  Class01 class01_1 = Class01();
  //2、自定义构造函数
  Class02 class02 = Class02('jack', 18);
  //3、dart每个类只能有一个ClassName的构造函数，但是支持命名构造函数，格式为“ClassName.identifier”
  Class03 class03 = Class03.crate('harry', 20);
  print(class03);
  //4、静态构造函数，使用const+ClassName构成的构造函数称为静态构造函数
  //  1:静态构造函数要初始化的变量必须用final修饰
  //  2:静态构造函数相同参数构造出来的对象是一个
  //  3:使用const创建，而不是new，如果const省略掉，就不是常量对象了，随之相同参数产生的对象也不是一个
  Class04 class04_01 = const Class04("lily", 21);
  Class04 class04_02 = const Class04("lily", 21);
  Class04 class04_03 = Class04("lily", 21);
  Class04 class04_04 = const Class04("lily", 22);
  print(identical(class04_01, class04_02));
  print(identical(class04_01, class04_03));
  print(identical(class04_01, class04_04));
  //5、重定向构造函数，如Class05
  Class05 class05 = Class05.crate03(23);
  //6、工厂构造函数，用factory修饰
  //  1:声明了factory构造函数后不能再声明普通构造函数，是一种特殊普通构造函数
  //  2:工厂构造函数中不能使用this
  //  3:工厂构造函数中必须有返回值
  //  4:生成变量方式跟普通构造函数一致
  //  5:只声明了factory构造函数的类，无法被继承，因为子类无法调用父类方法初始化
  Class06 class06 = Class06('lucy', 20);
  print(class06);
}

class Class01 {
  String name;
  int age;
}

class Class02 {
  String name;
  int age;

//  Class02(String name, int age) {
//    this.name = name;
//    this.age = age;
//  }

  //dart语法糖，简化构造函数
  Class02(this.name, this.age);
}

class Class03 {
  String name;
  int age;

  Class03(this.name, this.age);

  Class03.crate(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @override
  String toString() {
    // TODO: implement toString
    return 'name is $name and age is $age';
  }
}

class Class04 {
  final String name;
  final int age;

  const Class04(this.name, this.age);
}

class Class05 {
  String name;
  int age;

  Class05(this.name, this.age);

  Class05.crate01(String name, int age) : this(name, age); //重定向到默认构造函数
  Class05.crate02(String name) : this.crate01(name, 20); //重定向到crate01
  Class05.crate03(int age) : this.crate01('default', age); //重定向到crate01
}

class Class06 {
  String name;
  int age;
  static Class06 instance;

  factory Class06(String name, int age) {
    if (instance == null) {
      instance = Class06.create2(name, age);
    }
    return instance;
  }

  factory Class06.create1(String name, int age) {
    if (instance == null) {
      instance = Class06.create2(name, age);
    }
    return instance;
  }

  Class06.create2(this.name, this.age);
}

class Class07 {
  Class07();

  Class07.crate();

  Class07._create();

  Class07._(); //命名构造函数，只是名字为空而已
}
